﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Aeroporto.modelo;
using Aeroporto.bd;
using System.Data;
using System.Collections;
using System.Windows.Forms;
using Npgsql;

namespace Aeroporto.controle
{
    class VooControl
    {
        private VooDAO bd_voo = new VooDAO();
        private TrechoDAO bd_trecho = new TrechoDAO();

        public DataTable pesquisar_siglas(string nome)
        {
            DataTable dataTable = new DataTable();
            try
            {
                dataTable = bd_voo.pesquisar_siglas(nome);                
            }
            catch (Exception e)
            {
                Arquivo.escrever(e.ToString());
            }
            return dataTable;
        }

        public DataTable lista_dados(string tabela)
        {
            return bd_voo.lista_dados(tabela+" order by cod_iata");
        }

        internal MyMessageBox valida_insert_voo(string id_trecho, string num_voo, string horario, bool segunda, bool terca, bool quarta, bool quinta, bool sexta, bool sabado, bool domingo, string companhia, string origem, string destino)
        {
            MyMessageBox mb = valida_voo(id_trecho, num_voo, horario, segunda, terca, quarta, quinta, sexta, sabado, domingo, companhia, origem, destino);
            if (mb != null)
            {
                return mb;
            }
            else
            {                
                IGenericModel voo = new VooModel(companhia, num_voo);
                IGenericModel trecho = new TrechoModel(id_trecho, companhia, origem, num_voo, horario, destino, segunda, terca, quarta, quinta, sexta, sabado, domingo);
                bd_voo.gravar_dados(voo);
                bd_trecho.gravar_dados(trecho);
                return new MyMessageBox("Inserido com sucesso.", "OK");
            }
        }

        public MyMessageBox valida_voo(string id_trecho, string num_voo, string horario, bool segunda, bool terca, bool quarta, bool quinta, bool sexta, bool sabado, bool domingo, string companhia, string origem, string destino)
        {
            /*if (id_trecho == "")
            {
                return new MyMessageBox("Preencha o campo ID trecho.", "Atenção: campo ID trecho não foi preenchido.:");
            }*/
            if (num_voo == "")
            {
                return new MyMessageBox("Preencha o campo Número do voo.", "Atenção: campo Número do voo não foi preenchido.:");
            }
            if (horario == "  :  :")
            {
                return new MyMessageBox("Preencha o campo horário do voo.", "Atenção: campo horário do voo não foi preenchido.:");
            }
            if (segunda == false && terca == false && quarta == false && quinta == false && sexta == false && sabado == false && domingo == false)
            {
                return new MyMessageBox("O voo precisa ocorrer em pelo menos um dia na semana.", "Atenção: nenhum dia da semana foi selecionado.:");
            }
            /*
            if (bd_voo.pesquisarTrecho(id_trecho).Rows.Count > 0)
            {
                return new MyMessageBox("Id do trecho já existente", "Atenção: Coloque outro Id do trecho.:");
            }*/
            
            if (bd_voo.pesquisar_num_voo(num_voo, companhia).Rows.Count > 0)
            {
                return new MyMessageBox("Número do voo já existente", "Atenção: Coloque outro numero do voo.:");
            }
            if (origem == destino)
            {
                return new MyMessageBox("Aeroporto de destino e origem é o mesmo", "Atenção: o aeroporto de destino e origem é o mesmo.:");
            }
            return null;
        }

        public MyMessageBox exclui_voo(ArrayList voos, ArrayList trechos, string companhia)
        {
            MyMessageBox mb = bd_voo.excluir("trecho", "id_trecho", trechos);
            if (mb.String2 == "Erro não foi removido.:")
            {
                return mb;
            }
            mb = bd_voo.excluir_voo(voos, companhia);
            return mb;
        }

        public MyMessageBox valida_update_voo(
                string id_trecho, string num_voo, string horario, bool segunda, bool terca, bool quarta,
                bool quinta, bool sexta, bool sabado, bool domingo, string companhia, string origem,
                string destino, string num_voo_antigo, string id_trecho_antigo)
        {
            if (id_trecho == "" || num_voo == "" || horario == "")
            {
                return new MyMessageBox("Para editar selecione na tabela um voo com um duplo clique.", "Atenção");
            }
            if (id_trecho != id_trecho_antigo || num_voo != num_voo_antigo)
            {
                return new MyMessageBox("O número do voo e o trecho não podem ser alterados.","Atenção");
            }
            MyMessageBox mb = valida_voo(id_trecho, num_voo, horario, segunda, terca, quarta, quinta, sexta, sabado, domingo, companhia, origem, destino);
            if (mb != null)
            {
                return mb;
            }
            else
            {
                TrechoModel trecho = new TrechoModel(id_trecho, companhia, origem, num_voo, horario, destino, segunda, terca, quarta, quinta, sexta, sabado, domingo);                                
                try{
                    bd_trecho.update_dados(trecho);                    
                    return new MyMessageBox("Voo atualizado!", "Trecho");
                }catch(NpgsqlException e){
                    throw e;
                }                
            }   
        }

        public DataTable pesquisar_num_voo(string num_voo, string companhia)
        {
            return bd_voo.pesquisar_num_voo(num_voo, companhia);
        }

        public DataTable pesquisar(string companhia, string num_voo, string id_trecho)
        {
            DataTable dataTable = new DataTable();
            try
            {
                dataTable = bd_voo.pesquisar_instancia(companhia, num_voo, id_trecho);
            }
            catch (Exception e)
            {
                Arquivo.escrever(e.ToString());
            }
            return dataTable;
        }

        public string add_instancia(string data, string id_trecho)
        {
            return bd_trecho.add_instancia(data, id_trecho);
        }

        public MyMessageBox exclui_voo(ArrayList datas_viagens, string id_trecho)
        {
            return bd_trecho.excluir(datas_viagens, id_trecho);
        }

        internal string disponibilizar(string data, string id_trecho, string cod_aeronave)
        {
            return bd_trecho.disponibilizar(data, id_trecho, cod_aeronave);
        }
    }
}
